package ch10_thread.thread;

/**
 * Java类可能有很多个对象，但是只有一个Class对象
 * 本质：所谓的类锁，不过是Class对象的锁而已
 * 效果和方法：类锁只能在同一时刻被一个对象拥有
 * 类锁-synchronize加在static方法上
 * <p>
 * 多线程访问同步方法的七种情况？
 * 1、两个线程访问一个对象的同步方法？
 * 2、两个线程访问两个对象的同步方法？
 * 3、两个线程访问的是synchronized的静态方法？
 * 4、同时访问同步方法和非同步方法？
 * 5、访问同一个对象的不同的普通同步方法？
 * 6、同时访问静态的synchronized和非静态的synchronized方法？
 * 7、方法抛出异常，会释放锁？
 *
 * @author guodd
 * @version 1.0 use jdk 1.8
 */
public class Synchronized05 implements Runnable {
    public static void main(String[] args) {
        Synchronized05 syn01 = new Synchronized05();
        Synchronized05 syn02 = new Synchronized05();
        Thread t01 = new Thread(syn01);
        Thread t02 = new Thread(syn02);
        t01.start();
        t02.start();
    }

    @Override
    public void run() {
        methodSta();
    }

    private static synchronized void methodSta() {
        System.out.println("类锁" + Thread.currentThread().getName());
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "结束");
    }
}
